﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CdgNetPersistencia.ComponentesSQL;
using System.Reflection;
using CdgNetPersistencia.Atributos;

  /**
    * Autor :  Cristian Daniel Garay Sosa
    * Fecha :  26/03/2012 (v2)
    * Comentarios:
    *          representa a una fila de una tabla pudiendo extenderse segun se necesite
    * 
    * Cambios:
    *          26/03/2012 - CDGS - Eliminados los Getters y Setters inteligentes ({ get; set; })
    *                              Las propiedades pasan a ser protegidas y accesibles solo a traves
    *                              de los Getters y Setters individuales
    * 
    * **/

namespace CdgNetPersistencia.ClasesBases
{
    

    /// <summary>
    /// Clase base de Objetos Transportadores de Datos
    /// </summary>
    public abstract class OTDbase
    {

        #region PROPIEDADES

        //PROPIEDADES
        public static string NOMBRE_CLASE = "OTDbase";

        public static string NOMBRE_TABLA = "";  

        protected long _nId;
        protected String _cDescripcion;

        Dictionary<string, Campo> __dicCampos;



        /// <summary>
        /// Devuelve o establece el comando de seleccion de datos de la tabla
        /// </summary>
        protected string _Select_sql { get; set; }

        /// <summary>
        /// Devuelve o establece el comando de insercion de datos a la tabla
        /// </summary>
        protected string _Insert_sql { get; set; }

        /// <summary>
        /// Devuelve o establece el comando de actualizacion de datos de la tabla
        /// </summary>
        protected string _Update_sql { get; set; }

        /// <summary>
        /// Devuelve o establece el comando de aliminacion de datos de la tabla
        /// </summary>
        protected string _Delete_sql { get; set; }


        #endregion


        #region CONSTRUCTORES

        /// <summary>
        /// Constructor por defecto de la clase
        /// </summary>
        public OTDbase()
        {
            _nId = 0;
            _cDescripcion = string.Empty;
        }

        /// <summary>
        /// Constructor de la clase
        /// </summary>
        /// <param name="nIdParam">Identificador</param>
        /// <param name="cDescripcionParam">Descripcion</param>
        public OTDbase(long nIdParam, string cDescripcionParam)
        {
            _nId = nIdParam;
            _cDescripcion = cDescripcionParam;    
        }


        #endregion


        #region GETTERS Y SETTERS


        public abstract void SetId(object oValor);

        /// <summary>
        /// Devuelve el identificador del objeto
        /// </summary>
        public virtual long GetId
        {
            get {
                return _nId;
            }
        }

        public abstract void SetDescripcion(object oValor);

        /// <summary>
        /// Devuelve la descripcion del objeto
        /// </summary>
        public virtual string GetDescripcion
        {
            get
            {
                return _cDescripcion;
            }
        }

        

        #endregion


        #region SOBRE_ESCRITOS

        /// <summary>
        /// Devuelve la representacion de la clase
        /// </summary>
        /// <returns>Representacion de la Clase</returns>
        public override string ToString()
        {
            return string.Format("<{0} - {1}>", _nId, _cDescripcion.ToUpper());
        }

        /// <summary>
        /// Metodo de comparacion de la clase
        /// </summary>
        /// <param name="obj">Instancia de la clase OTDbase contra la cual comparar</param>
        /// <returns>true si los objetos tienen el mismo Id</returns>
        public override bool Equals(object obj)
        {
            //evaluamos si el parametro es del mismo tipo
            if (!obj.GetType().Equals(GetType())) return false;

            //luego si es el mismo ID
            return _nId.Equals(((OTDbase)obj)._nId);
        }


        #endregion

        #region DML


        public abstract SelectSQL Select;


        #endregion

    }
}
